package gui;

import dto.HorarioDTO;
import dto.PacienteDTO;
import dto.TurnoDTO;
import fs.Data;
import java.awt.Color;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import jr.Reporter;
import static jr.Reporter.ComprobanteAsistenciaReport;
import static jr.Reporter.ComprobanteTurnoReport;
import static jr.Reporter.ListadoDeTurnosReport;
import logic.ComprobanteAsistencia;
import logic.ComprobanteTurno;
import logic.Especialidad;
import logic.Horario;
import logic.ListadoDeTurnos;
import logic.Medico;
import logic.ObraSocial;
import logic.ObraSocialPlan;
import logic.Paciente;
import logic.Turno;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.view.JasperViewer;
import util.InputHelper;

/**
 *
 * @author lucifer
 */
public class TurnoGrepPanel extends javax.swing.JPanel implements Slave {

  private Master master;

  public void SetMaster(Master master) {
    this.master = master;
  }

  public void SetModeActions() {
    ((JFrame) master).setTitle("Asignación de Turnos - Senzu");
  }

  
  public boolean ShowComprobantes;

  private ArrayList<Integer> tIDs;
  private int turnosLibresCount;
  private int turnosTotalesCount;
  private LocalDate lastTurnoHabilitadoFromMedicoTomorrow;

  private boolean isCreatingTurno;

  private Medico medicoSeleccionado;
  public void SetMedico(Medico m) {
    medicoSeleccionado = m;
  }

  private Paciente pacienteSeleccionado;
  public void SetPaciente(Paciente p) {
    pacienteSeleccionado = p;
  }

  public TurnoGrepPanel() {
  }

  public TurnoGrepPanel(Master master) {

    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          Turno.RegistrarTurnosViejosComoAusentes();
        } catch (Exception e) {
          System.out.printf("?registración de ausentes: failed\n");
        }
      }
    }).start();

    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          Turno.MandarComprobantesViaEmail();
        } catch (Exception e) {
          System.out.printf("?envio de emails: failed\n");
        }
      }
    }).start();

    SetMaster(master);

    initComponents();
    initCal();

    pacientejButton.setEnabled(false);
    setEnabledProcesoDeAsignacion(false);
    setEnabledCancelacionDeTurnoAsistencia(false);

    setUpTabs();
  }

  private void initCal() {
    jCalendar1.getDayChooser().setDayBordersVisible(false);
    jCalendar1.getDayChooser().setDecorationBackgroundVisible(false);
    jCalendar1.getDayChooser().setDecorationBordersVisible(false);
    jCalendar1.setDecorationBackgroundVisible(false);
    jCalendar1.setDecorationBordersVisible(false);
    jCalendar1.getDayChooser().SetJTabbedPane(agendajTabbedPane);
    jCalendar1.getMonthChooser().SetTurnoGrepPanel(this); // dirty hack
  }

  // Qué, qué, qué… Nananana… sarasasasa, sarasasasá!
  public void NoTocaBoton() {
    if (medicoSeleccionado == null) {
      return;
    }

    try {
      lastTurnoHabilitadoFromMedicoTomorrow = Turno.UltimoTurnoGeneradoDelMedico(medicoSeleccionado.getId()).toLocalDate().plusDays(1);
    } catch (Exception e) {
      lastTurnoHabilitadoFromMedicoTomorrow = LocalDate.now();
      System.out.printf("?no hay turnos habilitados\n");
    }

    JButton[] days = jCalendar1.getDayChooser().GetJButtons();
    ArrayList<HorarioDTO> horarios = new ArrayList<>();
    jCalendar1.getDayChooser().DisableAllDayButtons();

    try {
      horarios = Horario.SearchByMedicoID(medicoSeleccionado.getId());
    } catch (SQLException e) {
    }

    LocalDate yesterday = LocalDate.now().plusDays(-1);
    LocalDate date;
    int year, month, day;

    for (HorarioDTO h : horarios) {
      for (int i = 7; i < days.length; i++) {
        try {
          day = Integer.parseInt(days[i].getText());
          month = jCalendar1.getMonthChooser().getMonth() + 1;
          year = jCalendar1.getYearChooser().getYear();
          date = LocalDate.of(year, month, day);

          // Today's only yesterday's tomorrow.
          if (h.getDia().equals(date.getDayOfWeek()) && date.isAfter(yesterday) && date.isBefore(lastTurnoHabilitadoFromMedicoTomorrow)) {
            days[i].setEnabled(true);

            boolean haySobreturnosLibres = false;
            try {
              haySobreturnosLibres = calculoDeTurnos(date);
            } catch (Exception e) {
              System.out.printf("?something wrong!\n");
            }
            if (turnosLibresCount == 0 && !haySobreturnosLibres) {
              paintButton(days[i], Color.WHITE, Color.DARK_GRAY);
              days[i].setToolTipText("No hay turnos libres para este día. Todos los turnos fueron anulados ó no se habilitaron turnos para este día.");
            } else if (turnosLibresCount == 0 && haySobreturnosLibres) {
              paintButton(days[i], new Color(255, 0, 96), Color.PINK);
              days[i].setToolTipText("No hay más turnos libres para este día. Sólo se pueden asignar sobreturnos.");
            } else if ((double)turnosLibresCount/turnosTotalesCount >= 0.5) {
              paintButton(days[i], new Color (0, 172, 64), Color.GREEN);
              days[i].setToolTipText("Hay turnos libres para este día.");
            } else {
              paintButton(days[i], new Color(192, 172, 0), Color.YELLOW);
              days[i].setToolTipText("Quedan pocos turnos libres para este día.");
            }
          }
        } catch (NumberFormatException e) {
        }
      }
    }
  }

  private void paintButton(JButton b, Color fg, Color bg) {
    if ("Windows".equals(UIManager.getLookAndFeel().getID()) || ("GTK".equals(UIManager.getLookAndFeel().getID()))) {
      b.setForeground(fg);
    } else {
      b.setBackground(bg);
    }
  }

  private boolean calculoDeTurnos(LocalDate fecha) throws SQLException {
    ArrayList<TurnoDTO> dtos = Turno.SearchByFechaMedico(fecha, medicoSeleccionado.getId());
    turnosTotalesCount = dtos.size();
    turnosLibresCount =  Turno.CantidadDeTurnosLibres(dtos);
    return Turno.SePuedenSacarSobreturnos(dtos);
  }

  private void setUpTabs() {
    if (medicoSeleccionado == null) {
      setEnabledThings(false);
    } else {
      setEnabledThings(true);
    }
  }

  private void setEnabledProcesoDeAsignacion(boolean b) {
    guardarTurnojButton.setEnabled(b);
    cancelarjButton.setEnabled(b);
    comprobantejCheckBox.setEnabled(b);
    comprobantejCheckBox.setSelected(b);
  }

  private void setEnabledCancelacionDeTurnoAsistencia(boolean b) {
    liberarTurnojButton.setEnabled(b);
    registrarAsistenciajButton.setEnabled(b);
  }

  private void setEnabledThings(boolean b) {
    agendajTabbedPane.setEnabled(b);
    jCalendar1.setEnabled(b);
    turnosjTable.setEnabled(b);
    turnosjScrollPane.setEnabled(b);
    anularFranjaHorariajButton.setEnabled(b);
    imprimirTurnosDelDiajButton.setEnabled(b);
  }

  public void UpdateMedicoData() throws SQLException {
    medicojLabel.setText(
      String.format(
        "<html><b>Dr. %s %s</b></html>",
        medicoSeleccionado.getNombre(), medicoSeleccionado.getApellido())
    );
    setEnabledThings(true);
    setEnabledCancelacionDeTurnoAsistencia(false);
    agendajTabbedPane.setSelectedIndex(0);
    updateTableWithMedicoAndDate();
    atendidoPorjLabel1.setText("Dr. " + medicoSeleccionado.getNombre() + " " + medicoSeleccionado.getApellido());
    especialidadjLabel1.setText(Especialidad.SearchByID(medicoSeleccionado.getIdEspecialidad()).getNombre());
    NoTocaBoton();
    turnosHabilitadosHasta();
    pacienteSeleccionado = null;
    cleanAll();
  }

  public void UpdatePacienteData() throws SQLException {
    if (medicoSeleccionado == null) {
      return;
    }

    if (pacienteSeleccionado == null) {
      isCreatingTurno = false;
      setEnabledThings(true);
      pacientejButton.setEnabled(false);
      seleccionarMedicojButton.setEnabled(true);
      updateTableWithMedicoAndDate();
      setEnabledProcesoDeAsignacion(false);
      setEnabledCancelacionDeTurnoAsistencia(false);
      cleanAll();
      return;
    }

    // tricky code
    int aux = turnosjTable.getSelectedRow();
    setEnabledThings(false);
    turnosjTable.setRowSelectionInterval(aux, aux);
    //
    setEnabledProcesoDeAsignacion(true);
    setEnabledCancelacionDeTurnoAsistencia(false);
    seleccionarMedicojButton.setEnabled(false);
    pacientejLabel.setText(
      String.format(
      "<html><b>%s %s</b></html>",
      pacienteSeleccionado.getNombre(), pacienteSeleccionado.getApellido()
      )
    );
    dnijLabel1.setText(Integer.toString(pacienteSeleccionado.getDni()));
    telefonojLabel1.setText(pacienteSeleccionado.getTelLinea());
    obraSocialjLabel1.setText(ObraSocial.SearchByID(pacienteSeleccionado.getIdObraSocial()).getNombre());
    planjLabel1.setText(ObraSocialPlan.SearchByID(pacienteSeleccionado.getIdPlanObraSocial()).getNombre());
    nafiliadojLabel1.setText(Integer.toString(pacienteSeleccionado.getNAfiliado()));
    estadojLabel1.setText("Modificado (no guardado en el sistema)");
    estadojLabel1.setForeground(Color.RED);
    setCoberturaLabel(pacienteSeleccionado.getIdObraSocial(), pacienteSeleccionado.getIdPlanObraSocial());
  }

  private void setCoberturaLabel(int idObraSocial, int idPlan) throws SQLException {
    String cobertura;
    if (medicoSeleccionado.CoberturaMatch(idObraSocial, idPlan)) {
      if (idObraSocial != 0) {
        cobertura = "Obra social y plan cubren la consulta";
      } else {
        cobertura = "-";
      }
    } else {
      cobertura = "<html><b>Obra social y/ó plan no cubren la consulta</b></hmtl>";
    }
    observacionjLabel1.setText(cobertura);
  }

  private void updateTableWithMedicoAndDate() {
    if (medicoSeleccionado == null) {
      return;
    }

    LocalDate fecha = jCalendar1.getDate() != null ? InputHelper.FromOldDateToNew(jCalendar1.getDate()).toLocalDate() : LocalDate.now();

    try {
      ArrayList<TurnoDTO> dtos = Turno.SearchByFechaMedico(fecha, medicoSeleccionado.getId());
      updateTabla(dtos);
    } catch (Exception e) {
      System.out.printf("?no turnos\n");
    }
  }

  private void updateTabla(ArrayList<TurnoDTO> dtos) throws SQLException {
    DefaultTableModel m = new DefaultTableModel();
    m.addColumn("Estado");
    m.addColumn("Turno");
    m.addColumn("Paciente");

    tIDs = new ArrayList<>();
    PacienteDTO p;
    String paciente;

    for (TurnoDTO t : dtos) {
      tIDs.add(t.getId());
      p = Paciente.SearchByID(t.getIdPaciente());
      paciente = new Turno(t).IsLibre() || p == null ? "" : String.format("%s %s", p.getNombre(), p.getApellido());
      m.addRow(
        new Object[] {
          t.getEstado() + (t.isSobreturno()? " (Sobreturno)": ""),
          t.getFecha().format(DateTimeFormatter.ofPattern("HH:mm'hs' dd/MM/yy")),
          paciente
        }
      );
    }

    turnosjTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    turnosjTable.setModel(m);
  }

  private void setAttributes(TurnoDTO t) throws SQLException {
    Turno turno = new Turno(t);
    PacienteDTO p = Paciente.SearchByID(t.getIdPaciente());

    if (turno.IsLibre()) {
      pacientejButton.setEnabled(true);
      cleanAll();
    } else if (turno.IsAnulado() && p == null) {
      pacientejButton.setEnabled(false);
      cleanAll();
    } else {
      pacientejButton.setEnabled(false);
      pacientejLabel.setText(
        String.format(
          "<html><b>%s %s</b></html>",
          p.getNombre(), p.getApellido()
        )
      );
      dnijLabel1.setText(Integer.toString(p.getDni()));
      telefonojLabel1.setText(p.getTelLinea());
      obraSocialjLabel1.setText(ObraSocial.SearchByID(p.getIdObraSocial()).getNombre());
      planjLabel1.setText(ObraSocialPlan.SearchByID(p.getIdPlanObraSocial()).getNombre());
      nafiliadojLabel1.setText(Integer.toString(p.getNAfiliado()));
      setCoberturaLabel(p.getIdObraSocial(), p.getIdPlanObraSocial());
    }

    setEnabledCancelacionDeTurnoAsistencia(turno.IsAsignado());

    String fecha = t.isSobreturno() ? t.getFecha().format(DateTimeFormatter.ofPattern("'Sobreturno para el' dd/MM/yy 'a las ' HH:mm'hs'")) : t.getFecha().format(DateTimeFormatter.ofPattern("HH:mm'hs' dd/MM/yy"));
    fechajLabel1.setText(fecha);
    estadojLabel1.setText(t.getEstado());
    estadojLabel1.setForeground(Color.BLACK);
  }

  private void cleanAll() {
    pacientejLabel.setText("<html><b>Turno en blanco</b></html>");
    dnijLabel1.setText("-");
    telefonojLabel1.setText("-");
    obraSocialjLabel1.setText("-");
    planjLabel1.setText("-");
    nafiliadojLabel1.setText("-");
    estadojLabel1.setText("-");
    fechajLabel1.setText("-");
    estadojLabel1.setForeground(Color.BLACK);
    observacionjLabel1.setText("-");
  }

  private void turnosHabilitadosHasta() {
    try {
      lastTurnoHabilitadoFromMedicoTomorrow = Turno.UltimoTurnoGeneradoDelMedico(medicoSeleccionado.getId()).toLocalDate().plusDays(1);
    } catch (Exception e) {
      lastTurnoHabilitadoFromMedicoTomorrow = LocalDate.now();
    }
    turnosGeneradosjLabel1.setText(lastTurnoHabilitadoFromMedicoTomorrow.plusDays(-1).format(DateTimeFormatter.ofPattern("dd/MM/yy")));
  }

  private void updateDataTurnos() {
    if (turnosjTable == null || turnosjTable.getSelectedRow() == -1) {
      return;
    }

    int id = tIDs.get(turnosjTable.getSelectedRow());
    try {
      TurnoDTO t = Turno.SearchByID(id);
      setAttributes(t);
    } catch (SQLException e) {
      System.out.printf("?id not found\n");
    }
  }

  private void printTurno(final int id) throws SQLException, JRException {
    ComprobanteTurno comprobante = new ComprobanteTurno(id);
    final JasperPrint jp = ComprobanteTurnoReport(comprobante.GenerarComprobante());

    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          String shortPDFFileName = String.format("%s.pdf", id);
          String pdfFile = String.format("%s/%s", Data.SENZU_COMPROBANTES, shortPDFFileName);
          Reporter.CopyPDFto(jp, pdfFile);
        } catch (Exception e) {
          System.out.printf("?comprobante pdf issue\n");
        }
      }
    }).start();

    if (!comprobantejCheckBox.isSelected()) {
      return;
    }

    if (ShowComprobantes) {
      JasperViewer viewer = new JasperViewer(jp, false);
      viewer.setTitle("Comprobante de Turno");
      viewer.setVisible(true);
      viewer.setFitWidthZoomRatio();
    } else {
      JasperPrintManager.printReport(jp, true);
    }
  }

  private void printAsistencia(int id) throws SQLException, JRException {
    ComprobanteAsistencia comprobante = new ComprobanteAsistencia(id);
    JasperPrint jp = ComprobanteAsistenciaReport(comprobante.GenerarComprobante());

    if (ShowComprobantes) {
      JasperViewer viewer = new JasperViewer(jp, false);
      viewer.setTitle("Comprobante de Asistencia");
      viewer.setVisible(true);
      viewer.setFitWidthZoomRatio();
    } else {
      JasperPrintManager.printReport(jp, true);
    }
  }

  private void printTurnosDelDia(Medico medico, LocalDate fecha) throws SQLException, JRException {
    ListadoDeTurnos listado = new ListadoDeTurnos(medico, fecha);
    JasperPrint jp = ListadoDeTurnosReport(listado.GenerarListado());

    if (false) {
      JasperPrintManager.printReport(jp, true);
    } else {
      JasperViewer viewer = new JasperViewer(jp, false);
      viewer.setTitle("Turnos del Día");
      viewer.setVisible(true);
      viewer.setFitWidthZoomRatio();
    }
  }

  public boolean IsCreatingTurno() {
    return isCreatingTurno;
  }

  // no cambiar el orden de esta porquería… por algo se llama HackSign() ;)
  public void HackSign() {
    pacientejButton.setEnabled(false);
    setEnabledProcesoDeAsignacion(false);
    setEnabledCancelacionDeTurnoAsistencia(false);
    setUpTabs();

    agendajTabbedPane.setSelectedIndex(0);
    agendajTabbedPaneMouseClicked(null);

    jCalendar1PropertyChange(null);
  }

  @SuppressWarnings("unchecked")
  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
  private void initComponents() {

    seleccionarMedicojButton = new javax.swing.JButton();
    medicojLabel = new javax.swing.JLabel();
    agendajTabbedPane = new javax.swing.JTabbedPane();
    jCalendar1 = new kalendar.calendar.JCalendar();
    turnosjScrollPane = new javax.swing.JScrollPane();
    turnosjTable = new JTable() {
      public boolean isCellEditable(int i, int j) {
        return false;
      }
    };
    pacientejButton = new javax.swing.JButton();
    pacientejLabel = new javax.swing.JLabel();
    dnijLabel = new javax.swing.JLabel();
    obraSocialjLabel = new javax.swing.JLabel();
    nafiliadojLabel = new javax.swing.JLabel();
    dnijLabel1 = new javax.swing.JLabel();
    obraSocialjLabel1 = new javax.swing.JLabel();
    nafiliadojLabel1 = new javax.swing.JLabel();
    atendidoPorjLabel = new javax.swing.JLabel();
    atendidoPorjLabel1 = new javax.swing.JLabel();
    especialidadjLabel = new javax.swing.JLabel();
    especialidadjLabel1 = new javax.swing.JLabel();
    registrarAsistenciajButton = new javax.swing.JButton();
    estadojLabel = new javax.swing.JLabel();
    estadojLabel1 = new javax.swing.JLabel();
    fechajLabel = new javax.swing.JLabel();
    fechajLabel1 = new javax.swing.JLabel();
    guardarTurnojButton = new javax.swing.JButton();
    turnosGeneradosjLabel = new javax.swing.JLabel();
    turnosGeneradosjLabel1 = new javax.swing.JLabel();
    telefonojLabel = new javax.swing.JLabel();
    telefonojLabel1 = new javax.swing.JLabel();
    planjLabel = new javax.swing.JLabel();
    planjLabel1 = new javax.swing.JLabel();
    cancelarjButton = new javax.swing.JButton();
    comprobantejCheckBox = new javax.swing.JCheckBox();
    liberarTurnojButton = new javax.swing.JButton();
    imprimirTurnosDelDiajButton = new javax.swing.JButton();
    anularFranjaHorariajButton = new javax.swing.JButton();
    observacionjLabel = new javax.swing.JLabel();
    observacionjLabel1 = new javax.swing.JLabel();

    seleccionarMedicojButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gui/medico.png"))); // NOI18N
    seleccionarMedicojButton.setText("Seleccionar médico");
    seleccionarMedicojButton.setMaximumSize(new java.awt.Dimension(192, 27));
    seleccionarMedicojButton.setMinimumSize(new java.awt.Dimension(192, 27));
    seleccionarMedicojButton.setPreferredSize(new java.awt.Dimension(192, 27));
    seleccionarMedicojButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        seleccionarMedicojButtonActionPerformed(evt);
      }
    });

    medicojLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    medicojLabel.setText("<html><b>Médico no seleccionado</b></html>");

    agendajTabbedPane.addMouseListener(new java.awt.event.MouseAdapter() {
      public void mouseClicked(java.awt.event.MouseEvent evt) {
        agendajTabbedPaneMouseClicked(evt);
      }
    });

    jCalendar1.setDecorationBackgroundVisible(false);
    jCalendar1.setSundayForeground(new java.awt.Color(0, 90, 164));
    jCalendar1.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
      public void propertyChange(java.beans.PropertyChangeEvent evt) {
        jCalendar1PropertyChange(evt);
      }
    });
    agendajTabbedPane.addTab("Calendario", jCalendar1);

    turnosjTable.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] {

      },
      new String [] {
        "Estado", "Turno", "Paciente"
      }
    ) {
      Class[] types = new Class [] {
        java.lang.String.class, java.lang.String.class, java.lang.String.class
      };
      boolean[] canEdit = new boolean [] {
        false, false, false
      };

      public Class getColumnClass(int columnIndex) {
        return types [columnIndex];
      }

      public boolean isCellEditable(int rowIndex, int columnIndex) {
        return canEdit [columnIndex];
      }
    });
    turnosjTable.getTableHeader().setReorderingAllowed(false);
    turnosjTable.addMouseListener(new java.awt.event.MouseAdapter() {
      public void mouseClicked(java.awt.event.MouseEvent evt) {
        turnosjTableMouseClicked(evt);
      }
    });
    turnosjTable.addKeyListener(new java.awt.event.KeyAdapter() {
      public void keyReleased(java.awt.event.KeyEvent evt) {
        turnosjTableKeyReleased(evt);
      }
    });
    turnosjScrollPane.setViewportView(turnosjTable);
    if (turnosjTable.getColumnModel().getColumnCount() > 0) {
      turnosjTable.getColumnModel().getColumn(0).setResizable(false);
      turnosjTable.getColumnModel().getColumn(1).setResizable(false);
      turnosjTable.getColumnModel().getColumn(2).setResizable(false);
    }

    agendajTabbedPane.addTab("Listado de Turnos", turnosjScrollPane);

    pacientejButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gui/pacientes.png"))); // NOI18N
    pacientejButton.setText("Asignar paciente");
    pacientejButton.setMaximumSize(new java.awt.Dimension(192, 27));
    pacientejButton.setMinimumSize(new java.awt.Dimension(192, 27));
    pacientejButton.setPreferredSize(new java.awt.Dimension(192, 27));
    pacientejButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        pacientejButtonActionPerformed(evt);
      }
    });

    pacientejLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    pacientejLabel.setText("<html><b>Turno en blanco</b></html>");

    dnijLabel.setText("DNI:");

    obraSocialjLabel.setText("Obra social:");

    nafiliadojLabel.setText("   N° de Afiliado:");

    dnijLabel1.setText("-");

    obraSocialjLabel1.setText("-");

    nafiliadojLabel1.setText("-");

    atendidoPorjLabel.setText("Médico:");

    atendidoPorjLabel1.setText("-");

    especialidadjLabel.setText("Especialidad:");

    especialidadjLabel1.setText("-");

    registrarAsistenciajButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gui/asistencia.png"))); // NOI18N
    registrarAsistenciajButton.setText("Registrar asistencia");
    registrarAsistenciajButton.setMaximumSize(new java.awt.Dimension(215, 27));
    registrarAsistenciajButton.setMinimumSize(new java.awt.Dimension(215, 27));
    registrarAsistenciajButton.setPreferredSize(new java.awt.Dimension(215, 27));
    registrarAsistenciajButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        registrarAsistenciajButtonActionPerformed(evt);
      }
    });

    estadojLabel.setText("Turno:");

    estadojLabel1.setText("-");

    fechajLabel.setText("Fecha:");

    fechajLabel1.setText("-");

    guardarTurnojButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gui/save.png"))); // NOI18N
    guardarTurnojButton.setText("Guardar turno");
    guardarTurnojButton.setMaximumSize(new java.awt.Dimension(215, 27));
    guardarTurnojButton.setMinimumSize(new java.awt.Dimension(215, 27));
    guardarTurnojButton.setPreferredSize(new java.awt.Dimension(215, 27));
    guardarTurnojButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        guardarTurnojButtonActionPerformed(evt);
      }
    });

    turnosGeneradosjLabel.setText("Fecha del último turno habilitado del médico:");

    turnosGeneradosjLabel1.setText("-");

    telefonojLabel.setText("Teléfono:");

    telefonojLabel1.setText("-");

    planjLabel.setText("Plan:");

    planjLabel1.setText("-");

    cancelarjButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gui/discard.png"))); // NOI18N
    cancelarjButton.setText("Descartar cambios");
    cancelarjButton.setMaximumSize(new java.awt.Dimension(215, 27));
    cancelarjButton.setMinimumSize(new java.awt.Dimension(215, 27));
    cancelarjButton.setPreferredSize(new java.awt.Dimension(215, 27));
    cancelarjButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        cancelarjButtonActionPerformed(evt);
      }
    });

    comprobantejCheckBox.setSelected(true);
    comprobantejCheckBox.setText("Imprimir comprobante");

    liberarTurnojButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gui/clear.png"))); // NOI18N
    liberarTurnojButton.setText("Liberar turno");
    liberarTurnojButton.setMaximumSize(new java.awt.Dimension(215, 27));
    liberarTurnojButton.setMinimumSize(new java.awt.Dimension(215, 27));
    liberarTurnojButton.setPreferredSize(new java.awt.Dimension(215, 27));
    liberarTurnojButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        liberarTurnojButtonActionPerformed(evt);
      }
    });

    imprimirTurnosDelDiajButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gui/turnos_del_dia.png"))); // NOI18N
    imprimirTurnosDelDiajButton.setText("Imprimir turnos del día");
    imprimirTurnosDelDiajButton.setMaximumSize(new java.awt.Dimension(215, 27));
    imprimirTurnosDelDiajButton.setMinimumSize(new java.awt.Dimension(215, 27));
    imprimirTurnosDelDiajButton.setPreferredSize(new java.awt.Dimension(215, 27));
    imprimirTurnosDelDiajButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        imprimirTurnosDelDiajButtonActionPerformed(evt);
      }
    });

    anularFranjaHorariajButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/gui/anular_turnos.png"))); // NOI18N
    anularFranjaHorariajButton.setText("Anular franja horaria");
    anularFranjaHorariajButton.setMaximumSize(new java.awt.Dimension(215, 27));
    anularFranjaHorariajButton.setMinimumSize(new java.awt.Dimension(215, 27));
    anularFranjaHorariajButton.setPreferredSize(new java.awt.Dimension(215, 27));
    anularFranjaHorariajButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        anularFranjaHorariajButtonActionPerformed(evt);
      }
    });

    observacionjLabel.setText("Observación:");

    observacionjLabel1.setText("-");

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
          .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
              .addComponent(turnosGeneradosjLabel)
              .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
              .addComponent(turnosGeneradosjLabel1))
            .addComponent(agendajTabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 436, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addComponent(seleccionarMedicojButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addComponent(medicojLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 436, javax.swing.GroupLayout.PREFERRED_SIZE))
          .addGroup(layout.createSequentialGroup()
            .addComponent(imprimirTurnosDelDiajButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(anularFranjaHorariajButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
        .addGap(18, 18, 18)
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
          .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
              .addComponent(especialidadjLabel)
              .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(nafiliadojLabel)
                .addComponent(dnijLabel, javax.swing.GroupLayout.Alignment.TRAILING)
                .addComponent(telefonojLabel, javax.swing.GroupLayout.Alignment.TRAILING)
                .addComponent(obraSocialjLabel, javax.swing.GroupLayout.Alignment.TRAILING)
                .addComponent(planjLabel, javax.swing.GroupLayout.Alignment.TRAILING)
                .addComponent(atendidoPorjLabel, javax.swing.GroupLayout.Alignment.TRAILING))
              .addComponent(estadojLabel)
              .addComponent(fechajLabel)
              .addComponent(observacionjLabel))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
              .addComponent(dnijLabel1)
              .addComponent(telefonojLabel1)
              .addComponent(obraSocialjLabel1)
              .addComponent(planjLabel1)
              .addComponent(atendidoPorjLabel1)
              .addComponent(nafiliadojLabel1)
              .addComponent(especialidadjLabel1)
              .addComponent(estadojLabel1)
              .addComponent(fechajLabel1)
              .addComponent(observacionjLabel1)))
          .addGroup(layout.createSequentialGroup()
            .addGap(244, 244, 244)
            .addComponent(pacientejButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
          .addComponent(pacientejLabel)
          .addComponent(comprobantejCheckBox)
          .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
              .addComponent(registrarAsistenciajButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(guardarTurnojButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
              .addComponent(cancelarjButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(liberarTurnojButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))))
    );
    layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
          .addComponent(seleccionarMedicojButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
          .addComponent(pacientejButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        .addGap(18, 18, 18)
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
          .addComponent(medicojLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
          .addComponent(pacientejLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        .addGap(18, 18, 18)
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
          .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(dnijLabel)
              .addComponent(dnijLabel1))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(telefonojLabel)
              .addComponent(telefonojLabel1))
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(obraSocialjLabel)
              .addComponent(obraSocialjLabel1))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(planjLabel)
              .addComponent(planjLabel1))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(nafiliadojLabel)
              .addComponent(nafiliadojLabel1))
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(atendidoPorjLabel)
              .addComponent(atendidoPorjLabel1))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(especialidadjLabel)
              .addComponent(especialidadjLabel1))
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(estadojLabel)
              .addComponent(estadojLabel1))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(fechajLabel)
              .addComponent(fechajLabel1))
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(observacionjLabel)
              .addComponent(observacionjLabel1))
            .addGap(90, 90, 90)
            .addComponent(comprobantejCheckBox))
          .addComponent(agendajTabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 360, javax.swing.GroupLayout.PREFERRED_SIZE))
        .addGap(9, 9, 9)
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
          .addComponent(turnosGeneradosjLabel)
          .addComponent(turnosGeneradosjLabel1)
          .addComponent(guardarTurnojButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
          .addComponent(cancelarjButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
          .addComponent(registrarAsistenciajButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
          .addComponent(liberarTurnojButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
          .addComponent(imprimirTurnosDelDiajButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
          .addComponent(anularFranjaHorariajButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
    );
  }// </editor-fold>//GEN-END:initComponents

  private void seleccionarMedicojButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_seleccionarMedicojButtonActionPerformed
    master.ShowSlave(master.MedicoGrepPanel());
  }//GEN-LAST:event_seleccionarMedicojButtonActionPerformed

  private void pacientejButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pacientejButtonActionPerformed
    master.PacienteGrepPanel().IsCreatingTurno = isCreatingTurno = true;
    master.ShowSlave(master.PacienteGrepPanel());
  }//GEN-LAST:event_pacientejButtonActionPerformed

  private void jCalendar1PropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_jCalendar1PropertyChange
    updateTableWithMedicoAndDate();
    updateDataTurnos();
    NoTocaBoton();
  }//GEN-LAST:event_jCalendar1PropertyChange

  private void turnosjTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_turnosjTableMouseClicked
    if (isCreatingTurno) {
      return;
    }
    updateDataTurnos();
  }//GEN-LAST:event_turnosjTableMouseClicked

  private void guardarTurnojButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guardarTurnojButtonActionPerformed
    int id = tIDs.get(turnosjTable.getSelectedRow());
    try {
      Turno t = new Turno(Turno.SearchByID(id));

      if (t.isSobreturno() && Turno.HayTurnosLibresDelMedicoEnFecha(t.getIdMedico(), t.getFecha().toLocalDate())) {
        int ans = JOptionPane.showConfirmDialog(
          this,
          "Todavía hay turnos libres regulares para este día.\nDesea asignar un sobreturno, de todas maneras?",
          "Existen turnos libres regulares",
          JOptionPane.YES_NO_OPTION,
          JOptionPane.QUESTION_MESSAGE
        );
        if (ans == JOptionPane.NO_OPTION) {
          isCreatingTurno = false;
          pacienteSeleccionado = null;
          setEnabledThings(true);
          pacientejButton.setEnabled(false);
          seleccionarMedicojButton.setEnabled(true);
          updateTableWithMedicoAndDate();
          setEnabledProcesoDeAsignacion(false);
          setEnabledCancelacionDeTurnoAsistencia(false);
          cleanAll();                                                                            
          return;
        }
      }

      TurnoDTO dto = t.AsignarTurnoToPacienteWithUserLog(pacienteSeleccionado.getId(), master.UID());
      JOptionPane.showMessageDialog(
        this,
        "Se asignó exitosamente un nuevo turno al paciente " + pacienteSeleccionado.getNombre() + " " +
        pacienteSeleccionado.getApellido() + ". " +
        "Para la fecha " + t.getFecha().toLocalDate().format(DateTimeFormatter.ofPattern("dd/MM/yy")) +
        " a las " + t.getFecha().toLocalTime() + "hs",
        "Éxito: Nuevo turno asignado", JOptionPane.INFORMATION_MESSAGE
      );

      // don't move it!
      printTurno(dto.getId());

      isCreatingTurno = false;
      pacienteSeleccionado = null;
      setEnabledThings(true);
      pacientejButton.setEnabled(false);
      seleccionarMedicojButton.setEnabled(true);
      setAttributes(dto);
      updateTableWithMedicoAndDate();
      setEnabledProcesoDeAsignacion(false);
      setEnabledCancelacionDeTurnoAsistencia(false);
      NoTocaBoton();

    } catch (JRException e) {
      JOptionPane.showMessageDialog(this, "No es posible imprimir el comprobante del turno. Verifique la configuración de su impresora, por favor.", "Atención!", JOptionPane.WARNING_MESSAGE);
    } catch (SQLException e) {

      JOptionPane.showMessageDialog(this, InputHelper.PanicMessage, "ERROR! Esta aplicación se cerrará", JOptionPane.ERROR_MESSAGE);
      System.exit(66);

    } catch (IllegalArgumentException e) {

      JOptionPane.showMessageDialog(
        this,
        "No es posible asignar el turno. Este turno acaba de ser asignado por otro usuario del sistema.", "Error!",
        JOptionPane.ERROR_MESSAGE
      );

      isCreatingTurno = false;
      pacienteSeleccionado = null;
      setEnabledThings(true);
      pacientejButton.setEnabled(false);
      seleccionarMedicojButton.setEnabled(true);
      updateTableWithMedicoAndDate();
      setEnabledProcesoDeAsignacion(false);
      setEnabledCancelacionDeTurnoAsistencia(false);
      cleanAll();
    }
  }//GEN-LAST:event_guardarTurnojButtonActionPerformed

  private void agendajTabbedPaneMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_agendajTabbedPaneMouseClicked
    NoTocaBoton();
    if (!isCreatingTurno) {
      cleanAll();
      updateTableWithMedicoAndDate();
    }
    if (agendajTabbedPane.getSelectedIndex() == 0) {
      pacientejButton.setEnabled(false);
      setEnabledCancelacionDeTurnoAsistencia(false);
    }
  }//GEN-LAST:event_agendajTabbedPaneMouseClicked

  private void registrarAsistenciajButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_registrarAsistenciajButtonActionPerformed
    int id = tIDs.get(turnosjTable.getSelectedRow());
    try {
      Turno t = new Turno(Turno.SearchByID(id));
      TurnoDTO dto = t.RegistrarAsistencia();
      PacienteDTO p = Paciente.SearchByID(t.getIdPaciente());
      JOptionPane.showMessageDialog(
        this,
        "Se registró exitosamente la asistencia del paciente " + p.getNombre() + " " + p.getApellido() + ".",
        "Éxito: Registración de la asistencia", JOptionPane.INFORMATION_MESSAGE
      );
      setAttributes(dto);
      setEnabledCancelacionDeTurnoAsistencia(false);
      updateTableWithMedicoAndDate();

      printAsistencia(id);

    } catch (SQLException e) {
      System.out.printf("?registrar asistencia db issue\n");
    } catch (JRException e) {
      System.out.printf("?registrar asistencia print issue\n");
    } catch (IllegalArgumentException e) {
      JOptionPane.showMessageDialog(this, "No es posible registrar la asistencia de un turno futuro. Seleccione un turno para el día de hoy, por favor.", "Atención!", JOptionPane.WARNING_MESSAGE);
    }
  }//GEN-LAST:event_registrarAsistenciajButtonActionPerformed

  private void liberarTurnojButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_liberarTurnojButtonActionPerformed
    int id = tIDs.get(turnosjTable.getSelectedRow());
    try {
      Turno t = new Turno(Turno.SearchByID(id));
      PacienteDTO p = Paciente.SearchByID(t.getIdPaciente());
      int ans = JOptionPane.showConfirmDialog(
        this,
        "Liberar el turno asignado al paciente " + p.getNombre() + " " + p.getApellido() + "?",
        "Desea liberar el turno?",
        JOptionPane.YES_NO_OPTION
      );
      if (ans == JOptionPane.YES_OPTION) {
        t.LiberarTurno();
        cleanAll();
        setEnabledCancelacionDeTurnoAsistencia(false);
        updateTableWithMedicoAndDate();
        NoTocaBoton();
      }
    } catch (SQLException e) {
      System.out.printf("?id not found\n");
    }
  }//GEN-LAST:event_liberarTurnojButtonActionPerformed

  private void cancelarjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelarjButtonActionPerformed
    int ans = JOptionPane.showConfirmDialog(
      this,
      "Descartar la asignación del turno al paciente " + pacienteSeleccionado.getNombre() + " " + pacienteSeleccionado.getApellido() + "?",
      "Desea descartar la asignación del turno?",
      JOptionPane.YES_NO_OPTION
    );
    if (ans == JOptionPane.YES_OPTION) {
      isCreatingTurno = false;
      pacienteSeleccionado = null;
      setEnabledThings(true);
      pacientejButton.setEnabled(false);
      seleccionarMedicojButton.setEnabled(true);
      updateTableWithMedicoAndDate();
      setEnabledProcesoDeAsignacion(false);
      setEnabledCancelacionDeTurnoAsistencia(false);
      cleanAll();
    }
  }//GEN-LAST:event_cancelarjButtonActionPerformed

  //FIXME
  private void imprimirTurnosDelDiajButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_imprimirTurnosDelDiajButtonActionPerformed
    if (jCalendar1.getDate() == null) {
      JOptionPane.showMessageDialog(this, "No seleccionó ningún día. Seleccione un día del calendario, por favor.", "Atención!", JOptionPane.WARNING_MESSAGE);
      return;
    }

    try {
      printTurnosDelDia(medicoSeleccionado, InputHelper.FromOldDateToNew(jCalendar1.getDate()).toLocalDate());
    } catch (SQLException e) {
      System.out.printf("?turnos del día db issue\n");
    } catch (JRException e) {
      System.out.printf("?turnos del día print issue\n");
    }
  }//GEN-LAST:event_imprimirTurnosDelDiajButtonActionPerformed

  private void anularFranjaHorariajButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_anularFranjaHorariajButtonActionPerformed
    if (turnosjTable.getSelectedRow() == -1) {
			JOptionPane.showMessageDialog(this, "No seleccionó ningún turno. Seleccione un rango de turnos en el `Listado de Turnos', por favor.", "Atención!", JOptionPane.WARNING_MESSAGE);
      return;
    }

    int fRow = turnosjTable.getSelectedRow();
    int lRow = fRow + turnosjTable.getSelectedRowCount();
    int range = lRow - fRow;

    int[] anulados = new int[range];

    for (int i = fRow; i < lRow; i++) {
      anulados[i - fRow] = tIDs.get(i);
    }

    int ans = JOptionPane.showConfirmDialog(
      this,
      String.format(
        "Anular %s %d turno%s del médico %s %s?",
        range == 1 ? "" : "los", range, range == 1 ? " seleccionado" : "s seleccionados", medicoSeleccionado.getNombre(), medicoSeleccionado.getApellido()
      ),
      "Desea anular turnos?",
      JOptionPane.YES_NO_OPTION
    );
    if (ans == JOptionPane.YES_OPTION) {
      try {
        for (int i : anulados) {
          new Turno(Turno.SearchByID(i)).AnularTurno();
        }
      } catch (Exception e) {
        JOptionPane.showMessageDialog(
          this,
          "No se pueden anular los turnos seleccionados. Por favor, verifique la conexión con la base de datos.", "Error!",
          JOptionPane.ERROR_MESSAGE
        );
      }
      pacientejButton.setEnabled(false);
      updateTableWithMedicoAndDate();
      cleanAll();
      NoTocaBoton();
    }
  }//GEN-LAST:event_anularFranjaHorariajButtonActionPerformed

  private void turnosjTableKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_turnosjTableKeyReleased
    turnosjTableMouseClicked(null);
  }//GEN-LAST:event_turnosjTableKeyReleased

  // Variables declaration - do not modify//GEN-BEGIN:variables
  private javax.swing.JTabbedPane agendajTabbedPane;
  private javax.swing.JButton anularFranjaHorariajButton;
  private javax.swing.JLabel atendidoPorjLabel;
  private javax.swing.JLabel atendidoPorjLabel1;
  private javax.swing.JButton cancelarjButton;
  private javax.swing.JCheckBox comprobantejCheckBox;
  private javax.swing.JLabel dnijLabel;
  private javax.swing.JLabel dnijLabel1;
  private javax.swing.JLabel especialidadjLabel;
  private javax.swing.JLabel especialidadjLabel1;
  private javax.swing.JLabel estadojLabel;
  private javax.swing.JLabel estadojLabel1;
  private javax.swing.JLabel fechajLabel;
  private javax.swing.JLabel fechajLabel1;
  private javax.swing.JButton guardarTurnojButton;
  private javax.swing.JButton imprimirTurnosDelDiajButton;
  private kalendar.calendar.JCalendar jCalendar1;
  private javax.swing.JButton liberarTurnojButton;
  private javax.swing.JLabel medicojLabel;
  private javax.swing.JLabel nafiliadojLabel;
  private javax.swing.JLabel nafiliadojLabel1;
  private javax.swing.JLabel obraSocialjLabel;
  private javax.swing.JLabel obraSocialjLabel1;
  private javax.swing.JLabel observacionjLabel;
  private javax.swing.JLabel observacionjLabel1;
  private javax.swing.JButton pacientejButton;
  private javax.swing.JLabel pacientejLabel;
  private javax.swing.JLabel planjLabel;
  private javax.swing.JLabel planjLabel1;
  private javax.swing.JButton registrarAsistenciajButton;
  private javax.swing.JButton seleccionarMedicojButton;
  private javax.swing.JLabel telefonojLabel;
  private javax.swing.JLabel telefonojLabel1;
  private javax.swing.JLabel turnosGeneradosjLabel;
  private javax.swing.JLabel turnosGeneradosjLabel1;
  private javax.swing.JScrollPane turnosjScrollPane;
  private javax.swing.JTable turnosjTable;
  // End of variables declaration//GEN-END:variables
}
